import axios from 'axios'
import { getTokenInfo,removeTokenInfo, setTokenInfo } from './storage'
// 请求基地址
import store from '@/store'
import { Toast } from 'antd-mobile'
import { Auth } from '@/store/reducers/user'
import history from './history'
export const baseURL = 'http://geek.itheima.net'
// 创建 axios 实例
const http = axios.create({
    baseURL: baseURL,
    timeout: 5000,
})

  
// 请求拦截器
http.interceptors.request.use(
  function (config: any) {
    // 获取缓存中的 Token 信息
    const { token } = getTokenInfo()
    // 设置请求头的 Authorization 字段
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
      console.log(20,config.headers.Authorization);
    }
        return config
      },
    function (error) {
      return Promise.reject(error)
    },
  )
  
  // 响应拦截器
  http.interceptors.response.use(
    function (response) {
      return response.data
    },
    async function (error) {
      console.dir(error)
      if (!error.response) {
      // 错误情况1：没有网络，response 为 undefined
      Toast.show({ content: '网络开小差，请换个环境试试.' })
    } else if (error.response.status !== 401){
      Toast.show({ content: error.response.data.message })
    }else{
       // 错误情况3：用户认证错误处理
       console.log('用户认证错误处理')
       const { refresh_token } = getTokenInfo()
       if (refresh_token) {
        //  // 根据 refresh_token 获取新 token
        //  const res = await axios({
        //    url: baseURL + `/v1_0/authorizations`,
        //    method: 'PUT',
        //    headers: {
        //      'Content-Type': 'application/x-www-form-urlencoded',
        //      Authorization: `Bearer ` + refresh_token,
        //    },
        //  })
        //  // 新 token
        //  console.log(res.data.data.token)
        //  const newToken = res.data.data.token
        //  const auth: Auth = { token: newToken, refresh_token: refresh_token }
        //   // 1. 存储到本地
        // setTokenInfo(auth)
        //  // 2. 存储到 redux
        //  store.dispatch({ type: 'user/saveAuth', payload: auth })
        //   // 获取错误请求的 config
        // // console.log('请求错误时的config', error.config)
        // // 3. 根据原本的信息，发送一次新的请求
        // return http(error.config)
        try {
          // 根据 refresh_token 获取新 token
          const res = await axios({
            url: baseURL + `/v1_0/authorizations`,
            method: 'PUT',
            headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              Authorization: `Bearer ` + refresh_token,
            },
          })
          // 新 token
          console.log(res.data.data.token)
          const newToken = res.data.data.token
          const auth: Auth = { token: newToken, refresh_token: refresh_token }
          // 1. 存储到本地
          setTokenInfo(auth)
          // 2. 存储到 redux
          store.dispatch({ type: 'user/saveAuth', payload: auth })
          // 获取错误请求的 config
          // console.log('请求错误时的config', error.config)
          // 3. 根据原本的信息，发送一次新的请求
          return http(error.config)
        } catch (error) {
          // console.log('🔔出错原因↓↓↓')
          // console.dir(error)
          // 用户看的懂的提示
          Toast.show({ content: '登录信息过期，请重新登录' })
          // 清空本地 token 信息
          removeTokenInfo()
          // 清理 redux token 信息
          store.dispatch({ type: 'user/clearAuth' })
          // 跳转登录页，并挈带回跳地址
          history.push('/login', { from: history.location.pathname })
        }
       }else{
          // 没有 refresh_token 的情况
        Toast.show({ content: '需登录后操作' })
        history.push('/login', { from: history.location.pathname })
       }
    }
      return Promise.reject(error)
    },
  )
  
  // 导出 axios 实例
  export default http